package Test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import entity.MyDemoEntity;
public class ListToMapUntil {
	@SuppressWarnings("rawtypes")
	/**
	 * 
	 * @param ClaasName 类的名字
	 * @param lists
	 * @param args 方法参数
	 * @return
	 */
	public static Map ListToMap(String ClaasName,List<?> lists,String ... args){
	Map<String,List<?>> map=new HashMap<String,List<?>>();
	//1.先建一个list 集合；
	Class<?> clazz=null;
	
	try {
		//根据类名构建Classname的class实例
		clazz=Class.forName(ClaasName);//实例化类名，得到具体的类名字
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
	//2.得到本类中的所有属性,也就是说得到本类中所有的字段的一个容器
	Field[] field = clazz.getDeclaredFields();
	for(Field fiel:field){
		String fieldName = fiel.getName();//将每一个字段从容器中取出来
		boolean isContinue=true;
	//3.判断属性是不是serialVersionUID;
		for(String arg:args){
			if(arg.equalsIgnoreCase(fiel.getName())){
				isContinue=false;
				break;
			}
		}
		if(!isContinue){
			continue;//跳过本次循环执行下面的程序
		}
	 //4.属性的名字的第一个名字大写
		String firstLetter=fieldName.substring(0,1).toUpperCase();//substring截取字符串的规则是包头不包尾
		
		String getMethod="get"+firstLetter+fieldName.substring(1);//这是得到属性的get方法
		List<Object> list=null;	
	    try {
	    	//5.得到类中的get方法
			Method method = clazz.getMethod(getMethod, new Class[]{});
			list=new ArrayList<>();
			for(Object entity:lists){
				/*6.对类中的get方法进行动态调用*/
				Object value = method.invoke(entity, new Object[]{});
				list.add(value);
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	   map.put(fieldName, list);
		
	}
	
	System.out.println(map);
	
	return map;
	
	}
	public static void main(String ...args){
		MyDemoEntity demo=new MyDemoEntity();
		demo.setMyKey("石家庄");
		demo.setMyValue(0);
		MyDemoEntity demo1=new MyDemoEntity();
		demo1.setMyKey("保定");
		demo1.setMyValue(1);
		MyDemoEntity demo2=new MyDemoEntity();
		demo2.setMyKey("张家口");
		demo2.setMyValue(2);
		List<MyDemoEntity> list=new ArrayList<>();
		list.add(demo);
		list.add(demo1);
		list.add(demo2);
		Map listToMap = ListToMap("entity.MyDemoEntity",list,"serialVersionUID");
		System.out.println(listToMap.get("MyKey")+";"+listToMap.get("MyValue"));
		
		
		
		
	}
}
